package com.huanong.it.fooder.service.impl;

import com.huanong.it.fooder.dto.CartItemDTO;
import com.huanong.it.fooder.entity.CartItem;
import com.huanong.it.fooder.entity.Product;
import com.huanong.it.fooder.entity.ShoppingCart;
import com.huanong.it.fooder.repository.CartItemRepository;
import com.huanong.it.fooder.repository.ProductRepository;
import com.huanong.it.fooder.repository.ShoppingCartRepository;
import com.huanong.it.fooder.service.CartItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class CartItemServiceImpl implements CartItemService {

    @Autowired
    private CartItemRepository cartItemRepository;

    @Autowired
    private ShoppingCartRepository shoppingCartRepository;

    @Autowired
    private ProductRepository productRepository;

    /**
     * 创建新的购物车项
     *
     * @param cartItemDTO 包含购物车项信息的DTO
     * @return 创建的购物车项的DTO
     */
    @Override
    public CartItemDTO createCartItem(CartItemDTO cartItemDTO) {
        CartItem cartItem = new CartItem();

        // 根据 cartId 查找购物车
        ShoppingCart cart = shoppingCartRepository.findById(cartItemDTO.getCartId())
                .orElseThrow(() -> new RuntimeException("Shopping cart not found"));

        // 根据 productId 查找产品
        Product product = productRepository.findById(cartItemDTO.getProductId())
                .orElseThrow(() -> new RuntimeException("Product not found"));

        // 设置购物车和产品
        cartItem.setCart(cart);
        cartItem.setProduct(product);
        cartItem.setQuantity(cartItemDTO.getQuantity());

        // 保存购物车项并返回DTO
        CartItem savedCartItem = cartItemRepository.save(cartItem);
        return convertToDTO(savedCartItem);
    }

    /**
     * 根据ID获取购物车项
     *
     * @param id 购物车项的ID
     * @return 购物车项的DTO
     */
    @Override
    public CartItemDTO getCartItemById(Long id) {
        // 查找购物车项，如果未找到则抛出异常
        CartItem cartItem = cartItemRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("Cart item not found"));
        return convertToDTO(cartItem);
    }

    /**
     * 获取所有购物车项
     *
     * @return 所有购物车项的DTO列表
     */
    @Override
    public List<CartItemDTO> getAllCartItems() {
        // 查找所有购物车项并转换为DTO列表
        List<CartItem> cartItems = cartItemRepository.findAll();
        return cartItems.stream().map(this::convertToDTO).collect(Collectors.toList());
    }

    /**
     * 更新购物车项
     *
     * @param id          购物车项的ID
     * @param cartItemDTO 包含更新信息的DTO
     * @return 更新后的购物车项的DTO
     */
    @Override
    public CartItemDTO updateCartItem(Long id, CartItemDTO cartItemDTO) {
        // 查找购物车项，如果未找到则抛出异常
        CartItem cartItem = cartItemRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("Cart item not found"));

        // 更新购物车项的数量
        cartItem.setQuantity(cartItemDTO.getQuantity());

        // 如果需要更新产品或购物车，可以在这里添加逻辑
        // 例如，如果 cartId 或 productId 发生变化
        if (!cartItem.getCart().getId().equals(cartItemDTO.getCartId())) {
            ShoppingCart cart = shoppingCartRepository.findById(cartItemDTO.getCartId())
                    .orElseThrow(() -> new RuntimeException("Shopping cart not found"));
            cartItem.setCart(cart);
        }

        if (!cartItem.getProduct().getId().equals(cartItemDTO.getProductId())) {
            Product product = productRepository.findById(cartItemDTO.getProductId())
                    .orElseThrow(() -> new RuntimeException("Product not found"));
            cartItem.setProduct(product);
        }

        // 保存更新后的购物车项并返回DTO
        CartItem updatedCartItem = cartItemRepository.save(cartItem);
        return convertToDTO(updatedCartItem);
    }

    /**
     * 删除购物车项
     *
     * @param id 购物车项的ID
     */
    @Override
    public void deleteCartItem(Long id) {
        // 删除购物车项
        cartItemRepository.deleteById(id);
    }

    /**
     * 将CartItem实体转换为CartItemDTO
     *
     * @param cartItem 购物车项实体
     * @return 转换后的购物车项DTO
     */
    private CartItemDTO convertToDTO(CartItem cartItem) {
        CartItemDTO dto = new CartItemDTO();
        dto.setId(cartItem.getId());
        dto.setCartId(cartItem.getCart().getId());
        dto.setProductId(cartItem.getProduct().getId());
        dto.setQuantity(cartItem.getQuantity());
        return dto;
    }
}
